<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>02_const关键字</title>
</head>
<body>
<!--
1. 作用:
  * 定义一个常量
2. 特点:
  * 其它特点同let
3. 应用:
  * 保存不用改变的数据
-->
<script type="text/javascript">

	
   // 与let不同之处，不能修改
  //  const PI=3.1415;
  //  PI=3.1415926;//  Assignment to constant variable.
   
  //  对于const来说，只声明不赋值，就会报错
  //  const dataInit
  //  console.log(dataInit)// Missing initializer in const declaration	   

</script>
<script>
   

   // 对象是引用数据类型,当重新给对象赋值,指针则会指向另一个地址,所以不是一个对象了，
  //  所以就违背了const不能修改的特点(内存地址所保存的数据不得改动)
   // 简单数据类型不必考虑,不能修改对象的地址，但可以修改对象（复杂数据类型）的 属性
   const person={
   	name:"独孤求败",
   	age:40
   }
  //  person = {} // Assignment to constant variable.
   person.name='殇不患';
   console.log(person);//{name: "殇不患", age: 40}
   
  
</script>
<script>
  //  'use strict'
   // 就是任性不让对象的属性值改变
   Object.freeze(person);
   person.name='凌雪鸦';//严格模式下则会报错 Cannot assign to read only property 'name' of object '#<Object>'
   console.log(person);//{name: "殇不患", age: 40}
   
   
  // 除了对象本身的冻结，对象的属性也可以冻结
  const constantize=(obj)=>{
	  Object.freeze(obj)
	  Object.keys(obj).forEach((key,i)=>{
		  if(typeof obj[key]==='object'){
			  constantize(obj[key])
		  }
	  })		
  } 
  const obj={
	  name:"冻结"
  }
  constantize(obj)
  obj.name=1
  obj.age=40
  console.log(obj)//{name: "冻结"}
</script>
</body>
</html>